package com.firewolf.mybatis.session.mains;

import java.io.IOException;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Before;
import org.junit.Test;

import com.firewolf.mybatis.session.beans.User;
import com.firewolf.mybatis.session.utils.MyBatisUtil;

/***
 * @Description: 测试类
 * @Author: 刘兴
 * @Date : 2016年8月20日
 * @package : com.firewolf.mybatis.session.mains
 * @Java_Version : 1.7
 * @Version : 2016年8月20日上午9:00:38
 */
public class MainDriver {
	
	private String qrySql = "userMapper.getUserById";
	
	private SqlSession session = null;
	
	@Before
	public void init() throws IOException{
		session = MyBatisUtil.getSessionFactory("conf.xml").openSession(true);
	}
	
	/***
	 * @Description: 
	 	一级缓存，session级的缓存，同一个session下的会缓存，默认是开启的，在查询之后再次查询的时候不再发送sql
	 	一级缓存被清楚有以下情况：
	 	①.	使用session.clearCache()清空缓存；
	 	②.	进行C/U/D之后就会清空缓存；
	 	③.	关闭session的时候缓存会被清空
	 	
	 * @输入和输出示例：
	 * @思路：
	 */
	@Test
	public void testOneLevel1(){
		/** 下面两个查询，使用的是一个session，相同的一个查询条件，只会发送出一个查询*/
		User user = session.selectOne(qrySql, 1);
		System.out.println(user);
		
		User user2 = session.selectOne(qrySql, 1);
		System.out.println(user2);
	}
	
	/**
	 * @Description: 使用session.clearCache()清空了缓存，那么下次再获取数据的时候会再次发送查询sql，会发送两条查询语句
	 * @输入和输出示例：
	 * @思路：
	 */
	@Test
	public void testOneLevel2(){
		User user = session.selectOne(qrySql, 1);
		System.out.println(user);
		
		session.clearCache();
		
		User user2 = session.selectOne(qrySql, 1);
		System.out.println(user2);
	}
	
	/***
	 * @Description: C/U/D之后也会清空缓存，会发送两条查询语句
	 * @输入和输出示例：
	 * @思路：
	 */
	@Test
	public void testOneLevel3(){
		User user = session.selectOne(qrySql, 1);
		System.out.println(user);
		session.update("userMapper.updateUser",new User(1,"liuxing",25));
		
		User user2 = session.selectOne(qrySql, 1);
		System.out.println(user2);
	}
	
	/**
	 * @Description: session关闭之后缓存就被清空了
	 * @输入和输出示例：
	 * @思路：
	 * @throws IOException
	 */
	@Test
	public void testOneLevel4() throws IOException{
		User user = session.selectOne(qrySql, 1);
		System.out.println(user);
		session.close();
		session = MyBatisUtil.getSessionFactory("conf.xml").openSession(true);
		User user2 = session.selectOne(qrySql, 1);
		System.out.println(user2);
	}
	
	/**
	 * @Description: 二级缓存是SqlSessionFactory级别的缓存，使用二级缓存，需要在配置中加入<cache/>配置，
	 * 				注意在每次用完session后，必须提交，不然也不会存到二级缓存,下面会发送一次查询语句
	 * @输入和输出示例：
	 * @思路：
	 * @throws IOException
	 */
	@Test
	public void testSecondLevel() throws IOException{
		SqlSessionFactory factory = MyBatisUtil.getSessionFactory("conf.xml");
		SqlSession session1 = factory.openSession();
		String qrySql2 = "userMapper2.getUserById";
		User user = session1.selectOne(qrySql2, 1);
		session1.commit();//必须提交，不然不会缓存下来
		System.out.println(user);


		SqlSession session2 = factory.openSession();
		User user2 = session2.selectOne(qrySql2, 1);
		System.out.println(user2);
		
	}
}
